/*
 * @Author: shenya shenya0203@163.com
 * @Date: 2024-03-25 20:35:42
 * @LastEditors: shenya shenya0203@163.com
 * @LastEditTime: 2024-04-25 16:49:45
 * @FilePath: /code/include/udp_server.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#ifndef __UDP_SERVER_H__
#define __UDP_SERVER_H__

#include "cJSON.h"
#include "fast_conble_define.h"
#include <signal.h>

extern uint8_t controlGroupFlag;

typedef struct
{
    char *data;
    size_t size;
} MemoryStruct; // 用于可重新分配内存大小 realloc

// mac 地址存储 要全局访问
#define ADDR_LEN 6
extern uint8_t g_mac_addr[ADDR_LEN];

extern uint8_t reportMsg_buffer[];
extern uint16_t reportMsg_len;

/**
 * @description: 初始化UDP服务器
 * @param {char *} ip_addr 绑定地址，本地地址
 * @param {uint16_t} port 接受端口
 * @return {*}  成功：句柄
 *              失败：-1
 */
int InitUdpServer(const char *ip_addr, uint16_t port);

// 获取本机MAC地址的函数
void GetMacAddress(const char *interface, uint8_t *body);

/**
 * @description: udp数据包解析和处理
 * @return {*}
 */
void StartUdpMsgHandle(void);

/**
 * @description: 关闭UDP服务器并释放资源
 * @return {*}
 */
void DeinitUdpServer(void);

/**
 * @description: 生成协议头部
 * @param {uint16_t} type 数据类型
 * @param {uint16_t} seq 序号
 * @return {*} 返回数据头部
 */
message_head_t GenerateHead(uint16_t type, uint16_t seq);

/**
 * @description: base64解码
 * @param {char *} in_str base64字符串
 * @param {int} in_len 字符串长度
 * @param {char *} out_str 解码后字符串
 * @return {int} 返回解码后字符串长度
 */

int base64_decode(char *in_str, int in_len, char *out_str);
char *base64_encode(const unsigned char *input, int length);
/**
 * @description: 通过http获取url的内容，并保存到json里面
 * @param {uint8_t} *url
 * @param {uint16_t} url_len
 * @param {void} **json 存放json格式数据
 * @return {*} 成功 0
 *             识别 -1
 */
int HttpGetDeviceInfo(uint8_t *url, uint16_t url_len, cJSON **json);

/**
 * @description: 发送短地址控制请求
 * @param {uint16_t} short_addr 短地址
 * @param {} data
 */
void short_addr_ctrl_seq(uint16_t short_addr, void *data);

/**
 * @description: UDP发送函数
 * @param {message_t} 数据包
 * @param {int} 长度
 * @return {*}  成功：发送字节数
 *              失败：-1
 */
int UdpSendtoRemote(message_t *package, int package_len);

int FastConbleUrlRequest(void);

void UrlRequest_timer_handler();
void UrlRequest_timer_create();
void UrlRequest_timer_set();
void UrlRequest_timer_stop();
#endif
